/**
 * @param {string} s1
 * @param {string} s2
 * @return {boolean}
 */
var checkInclusion = function (s1, s2) {
    const n = s1.length, m = s2.length;
    if (n > m) {
        return false;
    }
    const cnt = new Array(26).fill(0);
    for (let i = 0; i < n; ++i) {
        --cnt[s1[i].charCodeAt() - 'a'.charCodeAt()];
    }
    let left = 0;
    for (let right = 0; right < m; ++right) {
        const x = s2[right].charCodeAt() - 'a'.charCodeAt();
        ++cnt[x];
        while (cnt[x] > 0) {
            // 之前肯定是加了1的，现在还原回去
            --cnt[s2[left].charCodeAt() - 'a'.charCodeAt()];
            // 左指针移动
            ++left;
        }
        if (right - left + 1 === n) {
            return true;
        }
    }
    return false;
};

console.log(checkInclusion("ab", "eidbaooo"))

//================v3要点总结===============
/**
 * 注意到[left,right] 的长度每增加 1，cnt 的元素值之和就增加 1。
 * 当 [left,right] 的长度恰好为 n 时，就意味着 cnt 的元素值之和为 0。
 * 由于 cnt 的值不为正，元素值之和为 0 就意味着所有元素均为 0，这样我们就找到了一个目标子串。
 */